import { useUserStore } from '@/stores/user'

const store = useUserStore()
const byPassUrl = ['/m/weixin/login'] // 需要忽略报错的接口

// 网络请求方法
export function request(url, method, data = {}, header = {}) {
  const headers = {
    'content-type': 'application/x-www-form-urlencoded', // 默认传输数据为 json 格式，可以根据需要修改
    ...header,
  }

  // 如果 token 存在，自动添加到请求头中
  if (store.token)
    headers['X-Access-Token'] = store.token

  return new Promise((resolve, reject) => {
    uni.request({
      url: `${import.meta.env.VITE_API_BASE_URL}${url}`, // 完整的 URL
      method, // 请求方法：GET、POST等
      data, // 请求的参数
      header: headers,
      success: (res) => {
        // 登录过期
        if (res.statusCode === 401) {
          uni.showToast({ title: '请重新登录', icon: 'error', duration: 2000 }).then(() => {
            setTimeout(() => {
              store.setToken(null)
              store.setUserInfo(null)
              uni.reLaunch({ url: '/pages/me/index' })
            }, 2000)
          })
          reject(new Error('登录过期'))
        }
        // 请求成功
        if (res.statusCode === 200 && (byPassUrl.includes(url) || res.data.code === 200))
          resolve(res.data)
        else
          reject(new Error(res.data?.message || res.errMsg))
      },
      fail: () => {
        // 请求失败处理
      },
    })
  })
}

export function upload(options, formData) {
  return new Promise((resolve, reject) => {
    options.onStart()
    uni.uploadFile({
      url: `${import.meta.env.VITE_API_BASE_URL}/base/attachment/upload`,
      header: { 'X-Access-Token': store.token },
      filePath: options.filePath,
      name: 'file',
      formData,
      success: (res) => {
        if (res.statusCode === 200) {
          const { code, result, message } = JSON.parse(res.data)
          if (code === 200) {
            options.onSuccess(result)
            resolve(result)
          }
          else {
            options.onFailure(message)
            reject(new Error(message))
          }
        }
        else {
          options.onFailure()
          reject(new Error('上传失败'))
        }
      },
      fail: () => {
        options.onFailure()
        reject(new Error('网络异常，请稍后再试')) // 请求失败处理
      },
    })
  })
}
